#ifndef _INPUT_BOX_H_JM_20120626
#define _INPUT_BOX_H_JM_20120626
/// @file InputBox.h _OK_ Bazova trieda pre boxy nacitajuce data do programu.

#include "../RootBox.h"
#include "../../LogConf.h"

namespace jm4bbx {

	/**
	 * Bazova trieda pre boxy nacitajuce data do modelu vypoctu, ktora 
	 * zabezpecuje alokaciu pamate pre data a posielanie sprav s datami.
	 * InputBox vyuziva schopnosti signalov zdedene od triedy {@link RootBox}. 
	 * Vstupny signal musi byt minimalne jeden (ten ktory spusti vypocet), 
	 * dalsie vstupne signaly a pripdne vystupne signaly su volitelne podla 
	 * poziadaviek modelu. InputBox ma jednu klasicku vystupnu skupinu, ktora 
	 * nesie data vstupujuce do mnodelu. Bazova trieda alokuje priestor (podla 
	 * metody {@link #getColumnSize()} pre vstupne data a odosiela 
	 * ich do vypoctu. Pocet stlpcov vystupu je dany definiciou v modele. 
	 * Samotne naplnenie dat do struktur boxu je ponechane  na potomkov 
	 * v metode {@link #loadData()}.
	 * 
	 * @warning Metoda getColumnSize() sa vola medzi konstrukciou boxu a volanim
	 * metody loadData() a alokuje sa podla toho pamat pre data. Preto 
	 * je potrebne vediet velkost dat uz pred volanim loadData. Metoda loadData()
	 * je urcena na preklopenie dat do insternych struktur boxu a nie pre 
	 * ziskavanie dat ci ich generovanie.
	 * */
	class InputBox : public RootBox { 
		JM_USE_LOGGER(boxes_input_inputBox_logger)
	public:
		/// V stringovych parametroch modelu sa nesmu vyskytovat prazdne znaky.
		/// Preto sa pouziva zastupny znak, ktory sa bezne v texte 
		/// nevyskytuje. Pri nacitani sa tento znak nahradi za medzery.
		static const char BLANK_SPACE_PROXY_CHARACTER = '@';
		/// V stringovych parametroch modelu sa nesmu vyskytovat spatne lomitka.
		/// Preto sa pouziva zastupny znak, ktory sa bezne v texte 
		/// nevyskytuje. Pri nacitani sa tento znak nahradi za spatne lomitka.
		static const char BACKSLASH_PROXY_CHARACTER = '$';
		/// Index logickej vystupnej skupiny boxu.
		static const groupType OUTPUT_GROUP;	
		// Index prveho datoveho stlpca pre vystup.
		static const columnType OUTPUT_COLUMN;
		/// Fyzicky index vystupu.
		static const outType OUT_ARC;
		/// Meno parametra v modele vypoctu, ktory presnejsie specifikuje 
		/// pozadovane data. 
		/// @see inputSpecification_
		static const char* INPUT_SPECIFICATION_PARAMETER_NAME;

		InputBox(const BoxParamPack& paramsPack);

		/// Velkost stlpca (vsetkych stlpcov) == pocet riadkov.
		virtual size_t getColumnSize() const = 0;

		virtual void initImpl() override;
		virtual void syncMachEtwas() override;

	protected:

		/// Specifikacia pozadovanych dat. 
		/// V modele vypoctu moze uzivatel zadat do premennej 
		/// {@link INPUT_SPECIFICATION_PARAMETER_NAME} specifikaciu, ktoru moze
		/// vstupny box pouzit ku konkretizacii dat. Zalezi na potomkovi, ktory
		/// vstup dat realizuje ako sa k tomuto parametru postavi.
		std::string inputSpecification_;

		/**
		 * Natiahnutie dat do struktur boxu (stlpcov). Metoda sa vola vzdy
		 * po alokacii pamate a este pred samotnym odosielanim dat 
		 * dalsiemu boxu.
		 * */
		virtual void loadData() = 0;


	private :

		/// Inicalizacia datovych struktur pre data - alokacia pamate.
		void initDataStructures();
	};

}

#endif
